/*************************************************
 * 描述：序列化/反序列化工具类
 *
 * File：serialization.h
 * Author：qijiangyong@mozihealthcare.cn
 * Date：25-8-29
 * Update：
 * ************************************************/

#ifndef SERIALIZATION_H
#define SERIALIZATION_H

#include <memory>
#include <common/export.h>
#include "serialization/serializemacro.h"
#include "serialization/deserializemacro.h"

namespace serialization
{
	// 使用 extern "C" 防止 C++ 名字修饰
#ifdef __cplusplus
	extern "C" {
#endif
	// C 接口导出函数【若有】
#ifdef __cplusplus
	}
#endif
	/**
	 * 序列化
	 * @tparam T 类型
	 * @param obj 序列化数据
	 * @return 返回Json字符串
	 */
	template <typename T>
	inline std::string serializeJson(const T& obj)
	{
		rapidjson::Document doc;
		doc.SetObject();
		auto& alloc = doc.GetAllocator();

		to_json_value(obj, doc, alloc);

		rapidjson::StringBuffer buffer;
		buffer.Reserve(16*1024*1024);

		rapidjson::PrettyWriter<rapidjson::StringBuffer> writer(buffer);
		doc.Accept(writer);

		return std::string(buffer.GetString(), buffer.GetSize());
	}

	/**
	 * 反序列化
	 * @tparam T 数据类型
	 * @param json 原序列化json串
	 * @param target 存放的数据变量或容器 [ 一般传QList<T> ]
	 * @return 返回成功与否
	 */
	template <typename T>
	inline bool deserializeJson(const std::string& json, T& target)
	{
		if (json.empty()) return false;
		//.
		ondemand::parser parser;
		padded_string padded_json(json);
		auto doc = parser.iterate(padded_json);

		return deserialize(doc, target);
	}

}

#endif //SERIALIZATION_H
